package com.example.demo3annotation;

import org.junit.Test;

import java.lang.reflect.Method;
import java.util.Arrays;

/**
 * 目标：解析注解
 *       AnnotatedElement接口提供了解析注解的方法	                          说明
 * public Annotation[] getDeclaredAnnotations()	                          获取当前对象上面的注解。
 * public T getDeclaredAnnotation(Class<T> annotationClass)	              获取指定的注解对象
 * public boolean isAnnotationPresent(Class<Annotation> annotationClass)  判断当前对象上是否存在某个注解
 */
public class AnnotationDemo3 {
    // 解析类
    @Test
    public void parseClass() throws Exception {
        // 1.获取类对象
        Class c1 = Demo.class;

        // 2.判断这个类上是否陈列的注解MyTest2
        if (c1.isAnnotationPresent(MyTest2.class)) {
            // 3.获取注解对象
            MyTest2 myTest2 = (MyTest2) c1.getDeclaredAnnotation(MyTest2.class);

            // 4.获取注解属性值
            String[] address = myTest2.address();
            double height = myTest2.height();
            String value = myTest2.value();

            // 5.打印注解属性值
            System.out.println(Arrays.toString(address));
            System.out.println(height);
            System.out.println(value);
        }
    }

    // 解析方法
    @Test
    public void parseMethod() throws Exception {
        // 1.获取类对象
        Class c1 = Demo.class;
        // 2.获取方法对象
        Method method = c1.getDeclaredMethod("go");
        // 3.使用isAnnotationPresent判断方法上是否有注解
        if (method.isAnnotationPresent(MyTest2.class)) {
            // 4.获取注解对象
            MyTest2 myTest2 = method.getDeclaredAnnotation(MyTest2.class);

            // 5.获取注解属性值
            String[] address = myTest2.address();
            double height = myTest2.height();
            String value = myTest2.value();

            // 6.打印注解属性值
            System.out.println(Arrays.toString(address));
            System.out.println(height);
            System.out.println(value);
        }
    }
}
